package com.defysoft.waukidsbus;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.ActionBarActivity;
import android.widget.Toast;

public class BaseActionBarActivity extends ActionBarActivity implements PublicConstant{

	public Thread firstThread;

	public void setStartData() {// 처음 레이아웃 지정 메소드
	}

	public void onNetworkCallback(int _result, String _message) { // 네트워크에서
																	// 콜백된메소드
		sendMessage(_result, _message);
	}

	public void startNetwork(int choice) { // 스레드로 네트워크 체크전 네트워크 상태확인메소드
		if (!isNetworkStat(this)) {
			showErrPopup();
		} else {
			if(firstThread!=null){
				firstThread.interrupt();
			}
			startThread(choice);
			
		}
	}

	public void startThread(int choice) { // thread 시작을 위한 메소드
	}

	public String publicHttpCallback(String uri, String param) { //기본 http통신 흐름 
		String msg = "";
		try {
			URL url = new URL(uri);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setConnectTimeout(30 * 1000); // 30 secs
			conn.setReadTimeout(30 * 1000); // 30 secs
			conn.setRequestMethod("POST");
			conn.setUseCaches(false);
			conn.setRequestProperty("Accept-Charset", "UTF-8");
			conn.setRequestProperty("Accept_Language",
					"ko-kr,ko;q=0;en-us;q=0,en;q=0.3");

			OutputStream outStream = conn.getOutputStream();
			outStream.write(param.getBytes());
			outStream.flush();
			outStream.close();
			int nResCode = conn.getResponseCode();
			if (nResCode != HttpURLConnection.HTTP_OK) {
				String strResMsg = conn.getResponseMessage();
				Exception e = new Exception(strResMsg);
				throw e;
			}
			BufferedReader br = new BufferedReader(new InputStreamReader(
					conn.getInputStream()));
			String checkmsg;
			msg = br.readLine();
			while ((checkmsg = br.readLine()) != null) {
				msg += ("\n"+checkmsg);
			}
		} catch (Exception e) {
			onNetworkCallback(CATCH_EXCEPTION, e.toString());// 실패에 대한 네트워크 콜백을 지정한다.
			
		}
		return msg;
	}

	public void sendMessage(int nMessage) { // 핸들링하기위한 메세지 전송
		Message msg = this.m_Handler.obtainMessage(nMessage);
		this.m_Handler.sendMessage(msg);
	}

	public void sendMessage(int nMessage, String message) { // 핸들링하기위한 메세지 전송
		Message msg = this.m_Handler.obtainMessage(nMessage);
		msg.obj = message;
		this.m_Handler.sendMessage(msg);
	}

	protected final Handler m_Handler = new Handler() {// 센드된 메세지를 핸들링메소드로 넘기는
														// 메소드

		@Override
		public void handleMessage(Message message) {
			handlingMessage(message);
		}
	};

	protected void handlingMessage(Message _message) {// send된 메세지를 처리하는부분 재지정해서
														// 사용

	}

	public void showPopup(String _title, String _message, final int _returnID) {// 안내창을띄우기위한메소드
		AlertDialog.Builder alert = new AlertDialog.Builder(this);
		alert.setTitle(_title);
		alert.setMessage(_message);
		alert.setNegativeButton("OK", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int whichButton) {
				dialog.dismiss();
				if (_returnID != 0) {
					sendMessage(_returnID);
				}
			}
		});
		alert.setCancelable(true);
		alert.show();
	}

	public void showErrPopup() {// 네트워크 상테 애러메세지
		endDIal();
		showPopup("네트워크 오류", "네트워크 상태를 확인하세요", 0);
	}

	public boolean isNetworkStat(Context context) { // 네트워크 상태 체크 메소드
		ConnectivityManager manager = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo mobile = manager
				.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
		NetworkInfo wifi = manager
				.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
		NetworkInfo lte_4g = manager
				.getNetworkInfo(ConnectivityManager.TYPE_WIMAX);
		boolean blte_4g = false;
		if (lte_4g != null)
			blte_4g = lte_4g.isConnected();
		if (mobile != null) {
			if (mobile.isConnected() || wifi.isConnected() || blte_4g)
				return true;
		} else {
			if (wifi.isConnected() || blte_4g)
				return true;
		}
		return false;
	}

	public void startDIal() {
		startActivityForResult(new Intent(this, Prodialog.class),
				PublicConstant.PRODIALOG_RESULTCODE);
	}

	public void startDIal(int setcode) {
		Intent dialintent = new Intent(this, Prodialog.class);
		dialintent.putExtra(PublicConstant.PRODIALOG_SETCODE, setcode);
		startActivityForResult(dialintent, PublicConstant.PRODIALOG_RESULTCODE);
	}

	public void endDIal() {
		finishActivity(PublicConstant.PRODIALOG_RESULTCODE);
	}
}
